import Api from '@/common/Api.js'
import Config from "@/common/config.js"
import * as db from '@/common/db.js'
import tim from '@/commen/tim/tim.js'


async function getConfig() {
	await Api.request('Common/getConfig').then((res) => {
		if (res.code == 1) {
			db.set('config', res.data)
		} else {
			errorToShow(res.msg)
		}
	})
}

/**
 * IM登录
 */
function loginIm(userInfo) {
	if (userInfo.membe_id && userInfo.UserSign && db.get('auth')) {
		let promise = tim.tim.login({
			userID: userInfo.membe_id,
			userSig: userInfo.UserSign
		});
		promise.then((res) => {
			//登录成功后 更新登录状态
			this.$store.commit("toggleIsLogin", true);
			//自己平台的用户基础信息
			// uni.setStorageSync('userInfo', JSON.stringify(userInfo))
			//tim 返回的用户信息
			uni.setStorageSync('userTIMInfo', JSON.stringify(res.data))
			// uni.reLaunch({
			// 	url: '/pages/tim/record'
			// })
		}).catch((err) => {
			console.warn('login error:', err); // 登录失败的相关信息
		});
	} else {
		// uni.reLaunch({
		// 	url: '/pages/login/login'
		// })
	}

}

/**
 * 跳转登陆页面
 */
function toLogin() {
	Api.request('user/login', {
		req_token: db.get('req_token')
	}).then((res) => {
		if (res.code == 1) {
			uni.clearStorage()
			db.set('auth', res.token)
			db.set('user', res.user)
			uni.reLaunch({
				url: '/pages/index/index'
			})
		} else {
			uni.showToast({
				title: '登录失败'
			})
		}
	})
}

/**
 * 是否登陆，和绑定手机号，否则返回登录页
 */
function isLogin() {
	let auth = db.get('auth');
	//用户存在，不跳转，不存在直接跳转
	if (!auth) {
		// toLogin()
		// uni.reLaunch({
		// 	url: '/pages/login/login'
		// })
	}
}

// H5微信登录
async function isLoginH5() {
	try {
		// 获取本地token
		const hasToken = db.get('auth');
		if (!hasToken) {
			var code = getQueryString("code"); //hash模式获取url中code
			if (code) { //如果存在code,则拿code去后台获取openid拿到用户信息token

				//接口：前端将code传给后台，并把后台返回的Token存到Cookie和axios的header头中
				Api.request('user/login', {
					code: code
				}).then((result) => {
					if (result.code == 1) {
						db.set('auth', result.token)
						db.set('user', result.user)
					} else {
						if (result.msg.includes('code been used')) {
							getWxMpCode()
						} else {
							errorToShow('登录失败')
						}
					}
				})
			} else { //如果不存在code，url中包含code,说明已授权
				//hash模式微信登录授权验证，#号处理（如果在history模式下，这段#号处理if,else可删除）
				let url = window.location.href;
				console.log('url', url)
				if (url.includes("code")) { //url包括 com/?code 证明为从微信跳转回来的
					//vue自动在末尾加了 #/ 符号，截取去掉
					// var url = href.substring(0, href.length - 2);
					var jingPosit = url.indexOf("?code"); //获取?code位置
					var pagesStart = url.indexOf("#/"); //获取页面路径位置
					var pages = url.substring(pagesStart, url.length); // 页面路径
					console.log('jingPosit', jingPosit)

					var urlLeft = url.substring(0, jingPosit); //url左侧部分
					var urlRight = url.substring(jingPosit, pagesStart); //url右侧部分

					console.log(urlLeft + pages + urlRight);
					window.location.href = urlLeft + pages + urlRight; //拼接跳转
				} else { //如果不存在code且url中不包含code,说明未授权，去微信授权
					getWxMpCode()
				}
			}
		}
	} catch (error) {
		console.error(error, "-------beforeEach错误日志-----")
	}

}

// 获取公众号登录code
function getWxMpCode() {
	var config = db.get('config')
	if (config) {
		const appid = config.appId; // 公众号的唯一标识
		//授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理
		const redirect_uri = encodeURIComponent(window.location.href.split("?")[0]);
		//应用授权作用域：snsapi_userinfo（弹出授权页面，可通过openId拿到昵称、性别、所在地。）
		// const scope = "snsapi_userinfo"
		// 应用授权作用域：snsapi_base （不弹出授权页面，直接跳转，只能获取用户openId）
		const scope = "snsapi_base"
		const urls =
			`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect `
		window.location.href = urls
	} else {
		getConfig()
	}
}

function getQueryString(name) { //hash模式中需要用到解析url中的参数的函数
	var arr = (location.hash || "")
		.substr(location.hash.indexOf("?") + 1)
		.replace(/^\#/, "")
		.split("&");
	var params = {};
	for (var i = 0; i < arr.length; i++) {
		var data = arr[i].split("=");
		if (data.length == 2 && data[0] == name) {
			return data[1];
		}
	}
	return null;
}


// Start
// 微信H5支付
function callPay(response, urlPath) {
	if (typeof WeixinJSBridge === "undefined") {
		if (document.addEventListener) {
			document.addEventListener('WeixinJSBridgeReady', onBridgeReady(response, urlPath), false);
		} else if (document.attachEvent) {
			document.attachEvent('WeixinJSBridgeReady', onBridgeReady(response, urlPath));
			document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(response, urlPath));
		}
	} else {
		onBridgeReady(response, urlPath);
	}
}

// 拉起支付
function onBridgeReady(response, urlPath) {
	if (!response.package) {
		return;
	}
	WeixinJSBridge.invoke(
		'getBrandWCPayRequest', {
			"appId": response.appId, //公众号名称，由商户传入
			"timeStamp": response.timestamp, //时间戳，自1970年以来的秒数
			"nonceStr": response.nonceStr, //随机串
			"package": response.package,
			"signType": response.signType, //微信签名方式：
			"paySign": response.paySign //微信签名
		},
		function(res) {
			if (res.err_msg === "get_brand_wcpay_request:ok") {
				// 使用以上方式判断前端返回,微信团队郑重提示：
				//res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
				uni.showLoading({
					title: '支付成功'
				});
				setTimeout(function() {
					uni.hideLoading();
					uni.redirectTo({
						url: urlPath
					});
				}, 1000);
			} else {
				uni.hideLoading();
			}
			WeixinJSBridge.log(response.err_msg);
		}
	);
}

// 微信H5跳转微信客服
function openWeChat() {
	console.log('微信H5跳转微信客服')
	if (typeof WeixinJSBridge == "undefined") {
		if (document.addEventListener) {
			document.addEventListener('WeixinJSBridgeReady', openWeChat, false);
		} else if (document.attachEvent) {
			document.attachEvent('WeixinJSBridgeReady', openWeChat);
			document.attachEvent('onWeixinJSBridgeReady', openWeChat);
		}
	} else {
		WeixinJSBridge.invoke('profile', {
			'username': db.get('config').original_id
		});
	}
}
// End

// Start
// 微信支付
function wxPay(response, callback = function() {}) {
	if (!response.package) {
		return;
	}
	console.log(response)
	// 调用微信支付接口
	uni.requestPayment({
		provider: 'wxpay',
		timeStamp: response.timeStamp,
		nonceStr: response.nonceStr,
		package: response.package,
		signType: response.signType,
		paySign: response.paySign,
		success: function(paymentRes) {
			uni.showLoading({
				title: '支付成功'
			});
			setTimeout(function() {
				uni.hideLoading();
				callback();
			}, 1000);
		},
		fail: function(err) {
			console.log(err)
			uni.hideLoading();
		}
	});
	
	
}

function wxPayApp(response, callback = function() {}) {
	if (!response.package) {
		return;
	}
	console.log(response)
	// 调用微信支付接口
	uni.requestPayment({
		provider: 'wxpay',
		orderInfo: response,
		success: function(paymentRes) {
			uni.showLoading({
				title: '支付成功'
			});
			setTimeout(function() {
				uni.hideLoading();
				callback();
			}, 1000);
		},
		fail: function(err) {
			console.log(err)
			uni.hideLoading();
		}
	});
}

function aliPayApp(response, callback = function() {}) {
	if (!response.package) {
		return;
	}
	console.log(response)
	// 调用微信支付接口
	uni.requestPayment({
		provider: 'alipay',
		orderInfo: response,
		success: function(paymentRes) {
			uni.showLoading({
				title: '支付成功'
			});
			setTimeout(function() {
				uni.hideLoading();
				callback();
			}, 1000);
		},
		fail: function(err) {
			console.log(err)
			uni.hideLoading();
		}
	});
}
// End


/**
 * 无图标提示
 * @param {String} msg 提示消息
 * @param {Function} callback 回调函数
 */

function normalToShow(msg = '操作成功', callback = function() {}) {
	uni.showToast({
		title: msg,
		icon: 'none',
		duration: 800,
		mask:true
	});
	setTimeout(function() {
		callback();
	}, 500);
}
/**
 * 成功提示
 * @param {String} msg 提示消息
 * @param {Function} callback 回调函数
 */

function successToShow(msg = '操作成功', callback = function() {}) {
	uni.showToast({
		title: msg,
		icon: 'none',
		duration: 2000,
		mask:true
	});
	setTimeout(function() {
		callback();
	}, 2000);
}

/**
 * 失败提示
 * @param {String} msg 提示消息
 * @param {Function} callback 回调函数
 */

function errorToShow(msg = '网络波动', callback = function() {}) {
	uni.showToast({
		title: msg,
		icon: 'none',
		duration: 2000,
		mask:true
	});
	setTimeout(function() {
		callback();
	}, 2000);
}

/**
 * 加载显示
 * @param {String} msg 提示消息
 */
function loadToShow(msg = '加载中', icon = 'loading') {
	uni.showToast({
		title: msg,
		icon: icon,
		mask:true
	});
}

/**
 * 加载隐藏
 */

function loadToHide() {
	uni.hideToast();
}

/**
 * 上传图片
 * @param {Array} data 附带数据
 * @param {Function} callback 回调函数
 * @param {int} num 限制数量
 * @param {String} type 类型
 * @return {String} url 
 */
function chooseImage(data = {}, callback = function() {}, num = 1, type) {
	Api.chooseImage(
		'common/upload', data, (res) => {
			if (res.code) {
				if (res.url.substring(0, 9) == '/uploads/') {
					res.url = res.url
				}
				callback(res.url)
			} else {
				errorToShow(res.msg)
			}
		}, type)
}

function uploadImg(data = {}, callback = function() {}, num = 1, type) {
	Api.uploadImg(
		'common/upload', data, (res) => {
			if (res.code) {
				if (res.url.substring(0, 9) == '/uploads/') {
					res.url = res.url
				}
				callback(res.url)
			} else {
				errorToShow(res.msg)
			}
		}, type)
}

// 位置授权
function getAuthorizeInfo() {
	uni.authorize({
		scope: 'scope.userLocation',
		success() { // 允许授权
			getLocation()
		},
		fail() { // 拒绝授权
			getAuthorizeInfo();
			console.log("你拒绝了授权，无法获得周边信息")
		}
	})
}

function getLocation() {
	uni.getLocation({
		type: 'wgs84',
		success: function(res) {
			//获取到当前经纬度，然后使用高德第三方接口 进行地理逆编码
			restLocation({
				'latitude': res.latitude,
				'longitude': res.longitude
			})
			// return restLocation({'latitude':res.latitude, 'longitude':res.longitude})
		}
	});
}

//逆地理编码
function restLocation(data = {}) {
	const ajaxUrl =
		'https://restapi.amap.com/v3/geocode/regeo?key=f0ed1bf4fea7a5b6cf52780bd5fb846a&location=' +
		data.longitude + ',' + data.latitude + '&extensions=all&batch=false';
	uni.request({
		url: ajaxUrl,
		method: 'GET',
		success: res => {
			const {
				data: {
					regeocode
				}
			} = res;
			db.set('address', regeocode)
		}
	});
}

/**
 * scene解码
 */
function scene_decode(e) {
	if (e === undefined)
		return {};
	let scene = decodeURIComponent(e),
		params = scene.split(','),
		data = {};
	for (let i in params) {
		var val = params[i].split('=');
		val.length > 0 && val[0] && (data[val[0]] = val[1] || null)
	}
	return data;
}

/**
 * 图片预览
 */
function previewImage(url, urlList) {
	if(urlList.length == 0){
		return
	}
	
	var list = []
	urlList.forEach(item => {
		list.push(formatImgUrl(item))
	})
	uni.previewImage({
		current: formatImgUrl(url),
		urls: list ? list : [formatImgUrl(url)]
	});
}
	
function formatImgUrl(url) {
	var reg = new RegExp("http");
	//如果是images 那么直接读取本地

	
	if (typeof url == undefined || url == null || url == "" || url == "undefined" || url.length == 0) {
		return Config.CdnUrl + '/assets/images/default_avatar.png'
	} else {
		if (url.indexOf('http') < 0 && url.indexOf('@/') < 0 && url.indexOf('./') < 0 && url.indexOf('base64,') <
			0) {
			if (url.slice(0, 1) == '/') {
				url = url.slice(1, url.length)
			}
			return Config.CdnUrl + url
		} else {
			return url
		}
	}
}

export {
	getConfig,
	loginIm,
	toLogin,
	isLogin,
	isLoginH5,
	callPay,
	openWeChat,
	wxPay,
	wxPayApp,
	aliPayApp,
	normalToShow,
	successToShow,
	errorToShow,
	loadToShow,
	loadToHide,
	chooseImage,
	uploadImg,
	getAuthorizeInfo,
	getLocation,
	restLocation,
	scene_decode,
	previewImage,
	formatImgUrl
}